package com.hsnn.medstgmini.pro.plan.dao.impl;

import java.math.BigInteger;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.Subqueries;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.hsnn.medstgmini.base.dict.model.DicHosptype;
import com.hsnn.medstgmini.base.std.model.HospInfo;
import com.hsnn.medstgmini.base.std.model.StdCompinfo;
import com.hsnn.medstgmini.base.std.model.StdDrugInfo;
import com.hsnn.medstgmini.base.std.model.StdDruginfoDetail;
import com.hsnn.medstgmini.dao.HibernateSqlUtil;
import com.hsnn.medstgmini.pro.plan.dao.BidHospplandrugDao;
import com.hsnn.medstgmini.pro.plan.model.BidHospplan;
import com.hsnn.medstgmini.pro.project.model.BidProjdrugs;
import com.hsnn.medstgmini.pro.project.model.BidProjhospital;
import com.hsnn.medstgmini.util.Pagination;

@Repository("bidHospplandrugDao")
public class BidHospplandrugDaoImpl implements BidHospplandrugDao{
	@Autowired
	private HibernateSqlUtil UtilDao;

	
	@Resource(name = "sessionFactory")
	private SessionFactory sessionFactory;
	private Session getSession(){
		Session session = sessionFactory.getCurrentSession();
		if (null == session){
			session = sessionFactory.openSession();
		}
		return session;
	}
	
	
	/**
	 * 
	 *@category 获取当前医疗机构申报药品列表
	 *@author  
	 *@date 2015年6月12日 下午4:13:54
	 *@param page
	 *@return
	 */
	public Pagination getDrugDataList(Pagination page){
		StringBuffer sql = new StringBuffer()
		.append("select a.proj_drug_id,b.drug_code,b.drug_name,b.form_name,b.spec_name,b.factor,b.comp_name,b.drug_id,a.proj_id,c.material_name")
		.append(" from bid_projdrugs a left join view_drug b on a.drug_id=b.drug_id on dic_drugmaterial c")
		.append(" left join bid_project c on c.proj_id=a.proj_id ")
		.append(" where b.`status`=1 and c.starttime < SYSDATE() and c.endtime > SYSDATE() and a.`status`=1 order by projplanId asc");
		Map<String, String> map = page.getConditions();
		if (null != map && map.size() > 0){
			if (null != map.get("projId") && !"".equals(map.get("projId"))){
				sql.append(" and a.proj_id=:projId");
			}
			if (null != map.get("hospId") && !"".equals(map.get("hospId"))){
				sql.append(" and not EXISTS(select * from bid_hospplan d where d.proj_id=a.proj_id and d.drug_id=a.drug_id and d.hosp_id=:hospId")
				.append(")");
			}
			if (null != map.get("drugCode") && !"".equals(map.get("drugCode"))){
				sql.append(" and b.drug_code=:drugCode");
			}
			if (null != map.get("drugName") && !"".equals(map.get("drugName"))){
				sql.append(" and b.drug_name like :drugName");
			}
			if (null != map.get("prodPompId") && !"".equals(map.get("prodPompId"))){
				sql.append(" and b.prod_comp_id=:prodPompId");
			}
			
		}
		Query query = getSession().createSQLQuery("select count(*) from ("+sql.toString()+") ct");
		if (null != map && map.size() > 0){
			if (null != map.get("drugCode") && !"".equals(map.get("drugCode"))){
				query.setString("drugCode", map.get("drugCode"));
			}
			if (null != map.get("drugName") && !"".equals(map.get("drugName"))){
				query.setString("drugName", "%"+map.get("drugName")+"%");
			}
			if (null != map.get("prodPompId") && !"".equals(map.get("prodPompId"))){
				query.setString("prodPompId", map.get("prodPompId"));
			}
			if (null != map.get("projId") && !"".equals(map.get("projId"))){
				query.setString("projId", map.get("projId"));
			}
			if (null != map.get("hospId") && !"".equals(map.get("hospId"))){
				query.setString("hospId", map.get("hospId"));
			}
		}
		
		BigInteger records = (BigInteger) query.uniqueResult();
		page.setRecords(records.longValue());
		query = (Query) getSession().createSQLQuery(sql.toString());
		if (null != map && map.size() > 0){
			if (null != map.get("drugCode") && !"".equals(map.get("drugCode"))){
				query.setString("drugCode", map.get("drugCode"));
			}
			if (null != map.get("drugName") && !"".equals(map.get("drugName"))){
				query.setString("drugName", "%"+map.get("drugName")+"%");
			}
			if (null != map.get("prodPompId") && !"".equals(map.get("prodPompId"))){
				query.setString("prodPompId", map.get("prodPompId"));
			}
			if (null != map.get("projId") && !"".equals(map.get("projId"))){
				query.setString("projId", map.get("projId"));
			}
			if (null != map.get("hospId") && !"".equals(map.get("hospId"))){
				query.setString("hospId", map.get("hospId"));
			}
		}
		query.setFirstResult(page.getFirstResult());
		query.setMaxResults(page.getMaxResults());
		List<Object> list = query.list();
		page.setRows(list);
		return page;
	}
	
	
	public void delDrugData(BidHospplan bidHospplan){
		try {
			getSession().delete(bidHospplan);
			getSession().flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	
//	public void batchAddDrugData(List<BidHospplan> list){
//		if (null != list && list.size() > 0){
//			for (int i = 0; i < list.size(); i++){
//				delete(list.get(i));
//			}
//		}
//	}
	
 	//删除
	public void delete(BidHospplan data) {
		
		Session session = sessionFactory.getCurrentSession();
		if (data != null && StringUtils.isNotBlank(data.getProjPlanId())) {
			
			//	String hql = "from BidHospplan where projPlanId='"+data.getDrugId()+"'";//根据DrugId查询数据
			//	data = (BidHospplan) UtilDao.getUniqueResult(hql);//执行hql语句
				session.delete(data);//删除查询结果的对象
				session.flush();
		}
		
		
	}
	//批量
	public void batchChangeStatus(List<BidHospplan> list) {
		if (list != null && list.size() > 0) {
			for (BidHospplan data : list) {
				delete(data);
			}
		}
	}
	
	
	
	
/**********/
	//1
//	@Override
//	public Pagination getInfoBidHospplandrug(Pagination page) {
//		Criteria stdDrugInfoCriteria = getSession().createCriteria(
//				StdDrugInfo.class, "d");// 药品基础库
//		DetachedCriteria bidProjdrugsCriteria = DetachedCriteria.forClass(
//				BidProjdrugs.class, "pd");// 项目药品目录
//		bidProjdrugsCriteria.add(
//				Restrictions.eqProperty("d.drugId", "pd.drugId")).add(
//				Restrictions
//						.eq("pd.projId", page.getConditions().get("projId")));
//		DetachedCriteria stdDruginfoDetailCriteria = DetachedCriteria.forClass(
//				StdDruginfoDetail.class, "dd");// 药品详情
//		stdDruginfoDetailCriteria.add(Restrictions.eqProperty("d.stdDruginfoDetail.drugId",
//				"dd.drugId"));
//		// 药品编码关联查询
//		if (page.getConditions().get("drugCode") != null) {
//			stdDrugInfoCriteria.add(Restrictions.like("d.drugCode", page
//					.getConditions().get("drugCode"), MatchMode.ANYWHERE));
//		}
//		// 药品名称关联查询
//		if (page.getConditions().get("drugName") != null) {
//			stdDrugInfoCriteria.add(Restrictions.or(Restrictions.like(
//					"d.drugName", page.getConditions().get("drugName"),
//					MatchMode.ANYWHERE), Restrictions.like("d.drugNameSpel",
//					page.getConditions().get("drugName"), MatchMode.ANYWHERE)));
//		}
//		// 生产企业关联查询
//		if (page.getConditions().get("drugComp") != null) {
//			DetachedCriteria stdCompinfoCriteria = DetachedCriteria.forClass(
//					StdCompinfo.class, "dc");// 企业基础库
//			stdCompinfoCriteria.add(
//					Restrictions.eqProperty("d.compinfo.compId", "dc.compId"))
//					.add(Restrictions.like("dc.compName", page.getConditions()
//							.get("drugComp"), MatchMode.ANYWHERE));
//			stdDrugInfoCriteria.add(Subqueries.exists(stdCompinfoCriteria
//					.setProjection(Projections.property("compId"))));
//		}
//		// 药品详情关联查询
//		if (page.getConditions().get("baseDrug") != null
//				&&!StringUtils.isEmpty(page.getConditions().get("baseDrug"))) {
//				Short bd=Short.valueOf(page.getConditions().get("baseDrug"));
//				if(bd<1){
//					stdDruginfoDetailCriteria.add(Restrictions.isNull("dd.drugAttr"));
//				}else{
//					stdDruginfoDetailCriteria.add(Restrictions.isNotNull("dd.drugAttr"));
//				}
//
//		}
//		if (page.getConditions().get("lowDrug") != null
//				&& !StringUtils.isEmpty(page.getConditions().get("lowDrug"))) {
//			stdDruginfoDetailCriteria.add(Restrictions.eq("dd.isLowprice", Short.valueOf(page
//					.getConditions().get("lowDrug"))));
//		}
//		stdDrugInfoCriteria.add(Subqueries.exists(stdDruginfoDetailCriteria
//				.setProjection(Projections.property("drugId"))));
//		stdDrugInfoCriteria.add(Subqueries.notExists(bidProjdrugsCriteria
//				.setProjection(Projections.property("drugId"))));
//		stdDrugInfoCriteria.setFirstResult(page.getFirstResult())
//				.setMaxResults(page.getMaxResults());
////		stdDrugInfoCriteria.addOrder(Order.asc("drugCode"));//排序
//		List<StdDrugInfo> l = stdDrugInfoCriteria.list();
//		page.setRows(l);
//		//统计条数
//		Criteria stdDrugInfoSizeCriteria = getSession().createCriteria(
//				StdDrugInfo.class, "d");// 药品基础库
//		stdDrugInfoSizeCriteria.add(Subqueries.exists(stdDruginfoDetailCriteria
//				.setProjection(Projections.property("drugId"))));
//		stdDrugInfoSizeCriteria.add(Subqueries.notExists(bidProjdrugsCriteria
//				.setProjection(Projections.property("drugId"))));
//		// 药品编码关联查询
//		if (page.getConditions().get("drugCode") != null) {
//			stdDrugInfoSizeCriteria.add(Restrictions.like("d.drugCode", page
//					.getConditions().get("drugCode"), MatchMode.ANYWHERE));
//		}
//		// 药品名称关联查询
//		if (page.getConditions().get("drugName") != null) {
//			stdDrugInfoSizeCriteria.add(Restrictions.or(Restrictions.like(
//					"d.drugName", page.getConditions().get("drugName"),
//					MatchMode.ANYWHERE), Restrictions.like("d.drugNameSpel",
//					page.getConditions().get("drugName"), MatchMode.ANYWHERE)));
//		}
//		// 生产企业关联查询
//		if (page.getConditions().get("drugComp") != null) {
//			DetachedCriteria stdCompinfoCriteria = DetachedCriteria.forClass(
//					StdCompinfo.class, "dc");// 企业基础库
//			stdCompinfoCriteria.add(
//					Restrictions.eqProperty("d.compinfo.compId", "dc.compId"))
//					.add(Restrictions.like("dc.compName", page.getConditions()
//							.get("drugComp"), MatchMode.ANYWHERE));
//			stdDrugInfoSizeCriteria.add(Subqueries.exists(stdCompinfoCriteria
//					.setProjection(Projections.property("compId"))));
//		}
//		stdDrugInfoSizeCriteria.setProjection(Projections.rowCount());
//		Object results=stdDrugInfoSizeCriteria.uniqueResult();
//		
//		if(results!=null){
//			page.setRecords(Integer.valueOf(results.toString()));
//		}else{
//			page.setRecords(0);
//		}
//		return page;
//	}
	
	
	//2
//	@Override
//	public void batchSubmitHospTOProj(List<BidHospplan> data) {
//		Session session=getSession();
//		session.clear();
//		for(BidHospplan sdi: data){
//			session.save(sdi);
//		}
//		session.flush(); 
//		session.clear();
//	}
//	
	
	
	
	
	
	
	
	
	
	
	
	
	
}